1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.collect.testing.testers;
18
19 import static com.google.common.collect.testing.features.CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS;
20 import static com.google.common.collect.testing.features.CollectionSize.ONE;
21 import static com.google.common.collect.testing.features.CollectionSize.ZERO;
22 import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_ADD_WITH_INDEX;
23 import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_REMOVE_WITH_INDEX;
24 import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_SET;
25 import static java.util.Collections.emptyList;
26
27 import com.google.common.annotations.GwtCompatible;
28 import com.google.common.collect.testing.Helpers;
29 import com.google.common.collect.testing.features.CollectionFeature;
30 import com.google.common.collect.testing.features.CollectionSize;
31 import com.google.common.collect.testing.features.ListFeature;
32 import com.google.common.testing.SerializableTester;
33
34 import java.util.Arrays;
35 import java.util.Collections;
36 import java.util.List;
37
38
39
40
41
42
43
44
45 @SuppressWarnings("unchecked")
46 @GwtCompatible(emulated = true)
47 public class ListSubListTester<E> extends AbstractListTester<E> {
48 public void testSubList_startNegative() {
49 try {
50 getList().subList(-1, 0);
51 fail("subList(-1, 0) should throw");
52 } catch (IndexOutOfBoundsException expected) {
53 }
54 }
55
56 public void testSubList_endTooLarge() {
57 try {
58 getList().subList(0, getNumElements() + 1);
59 fail("subList(0, size + 1) should throw");
60 } catch (IndexOutOfBoundsException expected) {
61 }
62 }
63
64 public void testSubList_startGreaterThanEnd() {
65 try {
66 getList().subList(1, 0);
67 fail("subList(1, 0) should throw");
68 } catch (IndexOutOfBoundsException expected) {
69 } catch (IllegalArgumentException expected) {
70
71
72
73
74
75
76 }
77 }
78
79 public void testSubList_empty() {
80 assertEquals("subList(0, 0) should be empty",
81 emptyList(), getList().subList(0, 0));
82 }
83
84 public void testSubList_entireList() {
85 assertEquals("subList(0, size) should be equal to the original list",
86 getList(), getList().subList(0, getNumElements()));
87 }
88
89 @ListFeature.Require(SUPPORTS_REMOVE_WITH_INDEX)
90 @CollectionSize.Require(absent = ZERO)
91 public void testSubList_subListRemoveAffectsOriginal() {
92 List<E> subList = getList().subList(0, 1);
93 subList.remove(0);
94 List<E> expected =
95 Arrays.asList(createSamplesArray()).subList(1, getNumElements());
96 expectContents(expected);
97 }
98
99 @ListFeature.Require(SUPPORTS_REMOVE_WITH_INDEX)
100 @CollectionSize.Require(absent = ZERO)
101 public void testSubList_subListClearAffectsOriginal() {
102 List<E> subList = getList().subList(0, 1);
103 subList.clear();
104 List<E> expected =
105 Arrays.asList(createSamplesArray()).subList(1, getNumElements());
106 expectContents(expected);
107 }
108
109 @ListFeature.Require(SUPPORTS_ADD_WITH_INDEX)
110 public void testSubList_subListAddAffectsOriginal() {
111 List<E> subList = getList().subList(0, 0);
112 subList.add(samples.e3);
113 expectAdded(0, samples.e3);
114 }
115
116 @ListFeature.Require(SUPPORTS_SET)
117 @CollectionSize.Require(absent = ZERO)
118 public void testSubList_subListSetAffectsOriginal() {
119 List<E> subList = getList().subList(0, 1);
120 subList.set(0, samples.e3);
121 List<E> expected = Helpers.copyToList(createSamplesArray());
122 expected.set(0, samples.e3);
123 expectContents(expected);
124 }
125
126 @ListFeature.Require(SUPPORTS_SET)
127 @CollectionSize.Require(absent = ZERO)
128 public void testSubList_originalListSetAffectsSubList() {
129 List<E> subList = getList().subList(0, 1);
130 getList().set(0, samples.e3);
131 assertEquals("A set() call to a list after a sublist has been created "
132 + "should be reflected in the sublist",
133 Collections.singletonList(samples.e3), subList);
134 }
135
136 @ListFeature.Require(SUPPORTS_REMOVE_WITH_INDEX)
137 @CollectionSize.Require(absent = {ZERO, ONE})
138 public void testSubList_subListRemoveAffectsOriginalLargeList() {
139 List<E> subList = getList().subList(1, 3);
140 subList.remove(samples.e2);
141 List<E> expected = Helpers.copyToList(createSamplesArray());
142 expected.remove(2);
143 expectContents(expected);
144 }
145
146 @ListFeature.Require(SUPPORTS_ADD_WITH_INDEX)
147 @CollectionSize.Require(absent = {ZERO, ONE})
148 public void testSubList_subListAddAtIndexAffectsOriginalLargeList() {
149 List<E> subList = getList().subList(2, 3);
150 subList.add(0, samples.e3);
151 expectAdded(2, samples.e3);
152 }
153
154 @ListFeature.Require(SUPPORTS_SET)
155 @CollectionSize.Require(absent = {ZERO, ONE})
156 public void testSubList_subListSetAffectsOriginalLargeList() {
157 List<E> subList = getList().subList(1, 2);
158 subList.set(0, samples.e3);
159 List<E> expected = Helpers.copyToList(createSamplesArray());
160 expected.set(1, samples.e3);
161 expectContents(expected);
162 }
163
164 @ListFeature.Require(SUPPORTS_SET)
165 @CollectionSize.Require(absent = {ZERO, ONE})
166 public void testSubList_originalListSetAffectsSubListLargeList() {
167 List<E> subList = getList().subList(1, 3);
168 getList().set(1, samples.e3);
169 assertEquals("A set() call to a list after a sublist has been created "
170 + "should be reflected in the sublist",
171 Arrays.asList(samples.e3, samples.e2), subList);
172 }
173
174 public void testSubList_ofSubListEmpty() {
175 List<E> subList = getList().subList(0, 0).subList(0, 0);
176 assertEquals("subList(0, 0).subList(0, 0) should be an empty list",
177 emptyList(), subList);
178 }
179
180 @CollectionSize.Require(absent = {ZERO, ONE})
181 public void testSubList_ofSubListNonEmpty() {
182 List<E> subList = getList().subList(0, 2).subList(1, 2);
183 assertEquals("subList(0, 2).subList(1, 2) "
184 + "should be a single-element list of the element at index 1",
185 Collections.singletonList(getOrderedElements().get(1)), subList);
186 }
187
188 @CollectionSize.Require(absent = {ZERO})
189 public void testSubList_size() {
190 List<E> list = getList();
191 int size = getNumElements();
192 assertEquals(list.subList(0, size).size(),
193 size);
194 assertEquals(list.subList(0, size - 1).size(),
195 size - 1);
196 assertEquals(list.subList(1, size).size(),
197 size - 1);
198 assertEquals(list.subList(size, size).size(),
199 0);
200 assertEquals(list.subList(0, 0).size(),
201 0);
202 }
203
204 @CollectionSize.Require(absent = {ZERO})
205 public void testSubList_isEmpty() {
206 List<E> list = getList();
207 int size = getNumElements();
208 for (List<E> subList : Arrays.asList(
209 list.subList(0, size),
210 list.subList(0, size - 1),
211 list.subList(1, size),
212 list.subList(0, 0),
213 list.subList(size, size))) {
214 assertEquals(subList.isEmpty(), subList.size() == 0);
215 }
216 }
217
218 @CollectionSize.Require(absent = {ZERO, ONE})
219 public void testSubList_get() {
220 List<E> list = getList();
221 int size = getNumElements();
222 List<E> copy = list.subList(0, size);
223 List<E> head = list.subList(0, size - 1);
224 List<E> tail = list.subList(1, size);
225 assertEquals(list.get(0), copy.get(0));
226 assertEquals(list.get(size - 1), copy.get(size - 1));
227 assertEquals(list.get(1), tail.get(0));
228 assertEquals(list.get(size - 1), tail.get(size - 2));
229 assertEquals(list.get(0), head.get(0));
230 assertEquals(list.get(size - 2), head.get(size - 2));
231 for (List<E> subList : Arrays.asList(copy, head, tail)) {
232 for (int index : Arrays.asList(-1, subList.size())) {
233 try {
234 subList.get(index);
235 fail("expected IndexOutOfBoundsException");
236 } catch (IndexOutOfBoundsException expected) {
237 }
238 }
239 }
240 }
241
242 @CollectionSize.Require(absent = {ZERO, ONE})
243 public void testSubList_contains() {
244 List<E> list = getList();
245 int size = getNumElements();
246 List<E> copy = list.subList(0, size);
247 List<E> head = list.subList(0, size - 1);
248 List<E> tail = list.subList(1, size);
249 assertTrue(copy.contains(list.get(0)));
250 assertTrue(head.contains(list.get(0)));
251 assertTrue(tail.contains(list.get(1)));
252
253 assertTrue(copy.contains(list.get(size - 1)));
254 assertTrue(head.contains(list.get(size - 2)));
255 assertTrue(tail.contains(list.get(size - 1)));
256 assertFalse(head.contains(list.get(size - 1)));
257 assertFalse(tail.contains(list.get(0)));
258 }
259
260 @CollectionSize.Require(absent = {ZERO, ONE})
261 public void testSubList_indexOf() {
262 List<E> list = getList();
263 int size = getNumElements();
264 List<E> copy = list.subList(0, size);
265 List<E> head = list.subList(0, size - 1);
266 List<E> tail = list.subList(1, size);
267 assertEquals(copy.indexOf(list.get(0)),
268 0);
269 assertEquals(head.indexOf(list.get(0)),
270 0);
271 assertEquals(tail.indexOf(list.get(1)),
272 0);
273
274 assertEquals(copy.indexOf(list.get(size - 1)),
275 size - 1);
276 assertEquals(head.indexOf(list.get(size - 2)),
277 size - 2);
278 assertEquals(tail.indexOf(list.get(size - 1)),
279 size - 2);
280 assertEquals(head.indexOf(list.get(size - 1)),
281 -1);
282 assertEquals(tail.indexOf(list.get(0)),
283 -1);
284 }
285
286 @CollectionSize.Require(absent = {ZERO, ONE})
287 public void testSubList_lastIndexOf() {
288 List<E> list = getList();
289 int size = list.size();
290 List<E> copy = list.subList(0, size);
291 List<E> head = list.subList(0, size - 1);
292 List<E> tail = list.subList(1, size);
293 assertEquals(copy.lastIndexOf(list.get(size - 1)),
294 size - 1);
295 assertEquals(head.lastIndexOf(list.get(size - 2)),
296 size - 2);
297 assertEquals(tail.lastIndexOf(list.get(size - 1)),
298 size - 2);
299
300 assertEquals(copy.lastIndexOf(list.get(0)),
301 0);
302 assertEquals(head.lastIndexOf(list.get(0)),
303 0);
304 assertEquals(tail.lastIndexOf(list.get(1)),
305 0);
306 assertEquals(head.lastIndexOf(list.get(size - 1)),
307 -1);
308 assertEquals(tail.lastIndexOf(list.get(0)),
309 -1);
310 }
311
312 @CollectionFeature.Require(SERIALIZABLE_INCLUDING_VIEWS)
313 public void testReserializeWholeSubList() {
314 SerializableTester.reserializeAndAssert(getList().subList(0, getNumElements()));
315 }
316
317 @CollectionFeature.Require(SERIALIZABLE_INCLUDING_VIEWS)
318 public void testReserializeEmptySubList() {
319 SerializableTester.reserializeAndAssert(getList().subList(0, 0));
320 }
321
322 @CollectionFeature.Require(SERIALIZABLE_INCLUDING_VIEWS)
323 @CollectionSize.Require(absent = {ZERO, ONE})
324 public void testReserializeSubList() {
325 SerializableTester.reserializeAndAssert(getList().subList(0, 2));
326 }
327
328
329
330
331 }
332